//
//  EmoticonManager.swift
//  EmoticonKeyboard
//
//  Created by liii on 16/8/14.
//  Copyright © 2016年 liii. All rights reserved.
//

import UIKit

class EmoticonManager: NSObject {
    
    // 封装单例: NO.1, (提供唯一外部调用接口)
    static let sharedEmotionManager = EmoticonManager()
    
    // 模型数组
    var packages = [EmoticonPackages]()
    
    // 封装单例: NO.2, (私有化构造函数)
    private override init() {
        super.init()
        
        // 目的：给packages属性赋值
        loadEmoticons()
    }

    // 记载 Bundle 中的表情数据
    func loadEmoticons() {
        // 1，获取文件路径
        let path = NSBundle.mainBundle().pathForResource("emoticons.plist", ofType: nil, inDirectory: "Emoticons.bundle")!
        // 2，根据路径加载数据（字典）
        let dict = NSDictionary(contentsOfFile: path)!
        // 3，获取字典中的“packages” key中的value
        let packages = dict["packages"] as! [[String : AnyObject]]
        // 4，在获取字典中“id” key中的value，即获取分组名
        for p in packages {
            let id = p["id"] as! String
            print(id)
            // 5，根据分组名，加载分组中的数据
            loadGroupEmoticons(id)
        }
    }
    
    func loadGroupEmoticons(id: String) {
        // 1，获取文件路径
        let path = NSBundle.mainBundle().pathForResource("Info.plist", ofType: nil, inDirectory: "Emoticons.bundle/" + id)!
        // 2，通过路径加载整个数组
        let dict = NSDictionary(contentsOfFile: path)!
        // 3，获取"emoticons"数组的数据
        let name = dict["group_name_cn"] as! String
        let array = dict["emoticons"] as! [[String : String]]
        // 4，字典转模型
        let p = EmoticonPackages(id: id, name: name, array: array)
        // 5，添加到模型数组
        packages.append(p)
    }
}

extension EmoticonManager {

    
    /**
    把表情文字, 替换为表情图片
    :param: test 要替换的表情文字
    :param: font 替换成表情图片后的属性文本的大小
    :returns: 返回替换好的图片属性文本
    */
    func replaceTextToImage(text: String, font: UIFont) -> NSAttributedString {
        
        // 使用正则表达式, 截取正文中所有的表情字符串
//        let testString = "[奥特曼]他说:[爱你][拜拜]"
        let pattern = "\\[.*?\\]"
        let regular = try! NSRegularExpression(pattern: pattern, options: [])
        let result = regular.matchesInString(text, options: [], range: NSRange(location: 0, length: text.characters.count))
        
        // 用字符创实例化一个属性文本
        let strM = NSMutableAttributedString(string: text)
        // 倒序遍历
        var count = result.count - 1
        while count >= 0 {
            
            // 截取每个表情中的字符串
            let checkResult = result[count]
            let range = checkResult.rangeAtIndex(0)
            let subString = (text as NSString).substringWithRange(range)
            print(subString)
            
            // 如果能匹配到一个对应的表情模型, 就进行替换
            if let em = matchEmoticonWithEmoticonText(subString) {
                // 使用图片创建一个附件, 再通过附件创建一个图片属性文本
                let imageText = EmoticonTextAttachment.imageAttributedStringWithEmotion(em, font: font)
                // 把字符串属性文本, 替换成对应的图片属性文本(即表情文字, 转表情图片)
                strM.replaceCharactersInRange(range, withAttributedString: imageText)
            }
            count--
        }
        // 返回转换完毕的表情属性文本
        return strM
    }
    
    private func matchEmoticonWithEmoticonText(subStr: String) -> Emoticon? {
        
        // 获取所有表情数组的数据源
        for p in EmoticonManager.sharedEmotionManager.packages {
            // 在表情数组中查找对应的表情模型
            for emoticons in p.sectionEmoticon {
                
                // 查找所有和表情文字相同的, 表情模型, 返回值为一个"结果集"
                let rs = emoticons.filter({ (em) -> Bool in
                    return em.chs == subStr
                })
                
                // 判断查找的结果不为空, 则说明找到
                if rs.count != 0 {
                    // 返回匹配到的表情模型
                    return rs.first
                }
            }
        }
        return nil
    }
    
}
